﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;


namespace FirstGame
{
    public enum ScreenState
    {
        TransitionOn,
        TransitionOff,
        Active,
        InActive
    }
    public abstract class GameScreen : VisibleGameEntity
    {
        // Thời gian để chuyển từ TransitionOn --> Active
        protected TimeSpan _TransitionOnTime;

        public TimeSpan TransitionOnTime
        {
            get { return _TransitionOnTime; }
            set { _TransitionOnTime = value; }
        }

        // Thời gian để chuyển từ Active --> TransitionOff (biến mất)
        protected TimeSpan _TransitionOffTime;

        public TimeSpan TransitionOffTime
        {
            get { return _TransitionOffTime; }
            set { _TransitionOffTime = value; }
        }

        //quá trình chuyễn đổi được bao nhiêu tại thời điểm hiện tại
        protected float _TransitionPercent =0.0f;

        public float TransitionPercent
        {
            get { return _TransitionPercent; }
            set { _TransitionPercent = value; }
        }

        //Tóc độ xuất hiện, kết thúc của màn hình(tốc độ và thời gian chuyển quyết định TransitionPercent tại thời điểm đo)
        protected float _TransitionSpeed = 1.5f;

        public float TransitionSpeed
        {
            get { return _TransitionSpeed; }
            set { _TransitionSpeed = value; }
        }

        //Hướng chuyển màn hình (xuất hiện hay biến mất)
        protected int _TransitionDirection = 1;

        public int TransitionDirection
        {
            get { return _TransitionDirection; }
            set { _TransitionDirection = value; }
        }

        protected ScreenState _ScreenState;

        public ScreenState ScreenState
        {
            get { return _ScreenState; }
            set { _ScreenState = value; }
        }

        /// <summary>
        /// do trong suot cua man hinh
        /// </summary>
        /// <returns></returns>
        protected byte _ScreenAlpha;

        public byte ScreenAlpha
        {
            get { return (byte)(TransitionPercent * 255); }
            set { _ScreenAlpha = value; }
        }

        protected ScreenManager _Screenmanager;

        public ScreenManager Screenmanager
        {
            get { return _Screenmanager; }
            set { _Screenmanager = value; }
        }
        public bool IsActive()
        {
            return (_ScreenState == ScreenState.Active
                || _ScreenState == ScreenState.TransitionOn);
        }

        public event EventHandler Exited;
        public void Exit()
        {
            if (Exited != null)
                Exited(this, EventArgs.Empty);
        }

        public bool ScreenTransition(GameTime gameTime, TimeSpan transitionTime, int direction)
        {
            //chắc rằng direction la 1 hoặc -1
            if (direction > 0 && direction != 1)
                direction = 1;
            else if (direction < 0 && direction != -1)
                direction = -1;

            float transitionDelta;

            //nếu thời gian chuyển là 0(xuất hiện ngay)
            if (transitionTime == TimeSpan.Zero)
                transitionDelta = 1;
            else
                transitionDelta = (float)(gameTime.ElapsedGameTime.TotalMilliseconds / transitionTime.TotalMilliseconds);

            //cập nhật % việc chuyển màn hình
            _TransitionPercent += transitionDelta * direction * _TransitionSpeed;

            if ((_TransitionPercent < 0) || (_TransitionPercent > 1))
            {
                //kết thúc quá trình chuyển màn hình
                _TransitionPercent = MathHelper.Clamp(_TransitionPercent, 0, 1);
                return false;
            }
            return true;
        }
        public override void Update(GameTime gameTime, InputSystem input)
        {
            if (ScreenState == ScreenState.InActive)
            {
                return;
            }
            else if (ScreenState == ScreenState.TransitionOn)
            {
                if(ScreenTransition(gameTime, TransitionOnTime, 1))
                    ScreenState = ScreenState.TransitionOn;
                else 
                    ScreenState = ScreenState.Active;
            }
            else if (ScreenState == ScreenState.TransitionOff)
            {
                if (ScreenTransition(gameTime, TransitionOffTime, -1))
                    ScreenState = ScreenState.TransitionOff;
                else
                {
                    ScreenState = ScreenState.InActive;
                    Exit();
                }
            }
            
            base.Update(gameTime, input);
        }

       
    }
}
